from tkinter import *
import ttkbootstrap 
# from tkinter.ttk import *

# 预测答案：为了方便比较，手动对中奖号码进行了排序
ans = [2,17,22,26,27,33,6]

'''不能有超过范围的数字，不能有相同的号码'''
def is_true(arr_num):
    # 用一个字典来存储每个数字出现的次数
    text_dict = {}
    for i in range(0,6):
        # 如果前五个数字中有不在1—33范围内的数字，那么说明输入错误
        if arr_num[i]<1 or arr_num[i]>33:
            return False
        # 每次读取一个数字把其放入字典中
        if arr_num[i] not in text_dict:
            text_dict[arr_num[i]] = 1
        else:
            text_dict[arr_num[i]]+=1
    # 如果蓝色球的数字不在1~16的范围，也说明输入错误
    if arr_num[6]<1 or arr_num[6]>16:
        return False
    # 取出字典中的所有值
    times = text_dict.values()
    # 如果有某个值不为1，说明其已经出现了一次， 同样说明输入错误
    for i in times:
        if(i>1):
            return False
    return True

'''弹窗函数显示预测结果'''
def popup(text1):
    # 创建一个Toplevel窗口
    pop = Toplevel()
    # 在toplevel窗口中添加标签并设置文本
    lb = Label(pop,text=text1,font=('微软雅黑',15),anchor='center')
    lb.pack(fill=BOTH,expand=True)
    pop.title('result')
    pop.geometry("300x100")

    # 控制弹窗显示
    pop.grab_set() # 使得父窗口不可点击
    pop.mainloop()

'''判断是否获奖'''
def judge(arr_num):
    global ans
    red_time = 0
    blue_time = 0
    # 先判断蓝色号码是否正确
    if arr_num[6] == ans[6]:
        blue_time = 1
    # 取出输入的六个红色号码
    tmp_arr = arr_num[:6]
    # 对六个红色号码进行排序，方便找到相同的个数
    sorted(tmp_arr)
    # 采用双指针的方法进行寻找相同号码的个数
    end1 = 0
    end2 = 0
    while(end1<6 and end2<6):
        if(tmp_arr[end1]>ans[end2]):
            end2+=1
        elif(tmp_arr[end1]<ans[end2]):
            end1+=1
        else:
            end1+=1
            end2+=1
            red_time+=1

    # 根据相同号码的个数判断获奖等级
    if(red_time+blue_time==7):
        popup('一等奖！')
    elif(red_time==6):
        popup('二等奖！')
    elif(red_time==5 and blue_time==1):
        popup('三等奖！')
    elif(red_time==5 or red_time==4 and blue_time==1):
        popup('四等奖！')
    elif(red_time == 4 or red_time == 3 and blue_time == 1):
        popup('五等奖！')
    elif(blue_time == 1):
        popup('六等奖！')
    else:
        popup('可惜,就差一点点就中奖啦！')
    
# 定义按下按钮后的操作
def clicked():
    # 获取容器中的各个数据
    arr_num = []
    for i in range(0,7):
        arr_num.append(int(text_box[i].get()))
    # 首先先判断数据的有效性
    if not is_true(arr_num):
        # 弹窗提示要求重新输入
        popup('包含不正确的号码类型！')
    '''判断是否获奖并弹窗显示'''
    judge(arr_num)


# 设置一个好看的主题    
style = ttkbootstrap.Style(theme='pulse')
TOP6 = style.master

root = Tk()
root.title("can you win the prize?")
root.geometry('600x300')

# 让整个窗口元素靠上对齐
root.pack_propagate(0)

lb1 = Label(root, text="please enter seven lieutenant number", font=("Arial Bold",20))
# 设置 lb1 在第 0 行、第 0 列，并且将 lb1 垂直居中
lb1.grid(row=0, column=0, padx=10,sticky=("N", "S", "E", "W"))

# 创建一个frame，作为七个文本框的父对象
my_frame = Frame(root)
#创建七个文本框，并将它们添加到Frame中
#使得排列更加整齐
text_box = []
for i in range(0,7):
    text = Entry(my_frame,width=10)
    text.configure(bg='lightcoral')
    if i==6:
        text.configure(bg='skyblue')
    text.grid(row=0,column=i)
    text_box.append(text)
# 在主窗口中放置容器
my_frame.grid(row=1)

# 接下来是按钮，输入号码后点击按钮开始预测
btn = Button(root,text='start forcast!',command=clicked)
# 放置按钮
btn.grid(row=2,sticky=("N","E","S","W"))

# 开始事件
root.mainloop()